{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true,
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "# 逻辑回归代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib as mpl\n",
    "from sklearn.metrics import accuracy_score"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 加载数据的函数"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "outputs": [],
   "source": [
    "def loaddata():\n",
    "    data = np.loadtxt('data/data1.txt',delimiter=',')\n",
    "    n = data.shape[1] - 1  # 特征数\n",
    "    X = data[:, 0:n]\n",
    "    y = data[:, -1].reshape(-1, 1)\n",
    "    return X, y"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 画散点图"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "outputs": [],
   "source": [
    "def plot(X,y):\n",
    "    pos = np.where(y==1)\n",
    "    neg = np.where(y==0)\n",
    "    plt.scatter(X[pos[0],0],X[pos[0],1],marker='x')\n",
    "    plt.scatter(X[neg[0], 0], X[neg[0], 1], marker='o')\n",
    "    plt.xlabel('Exam 1 score')\n",
    "    plt.ylabel('Exam 2 score')\n",
    "    plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "X,y = loaddata()\n",
    "plot(X,y)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 实现sigmoid函数\n",
    "<img src=\"images/01.png\" width=\"200\" align=\"left\"/>"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "outputs": [],
   "source": [
    "def sigmoid(z):\n",
    "    r = 1/(1+np.exp(-z))\n",
    "    return r"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 实现假设函数\n",
    "<img src=\"images/02.png\" width=\"200\" align=\"left\"/>"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "outputs": [],
   "source": [
    "def hypothesis(X,theta):\n",
    "    z=np.dot(X,theta)\n",
    "    return sigmoid(z)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 损失函数\n",
    "<img src=\"images/03.png\" width=\"250\" align=\"left\"/>"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "outputs": [],
   "source": [
    "def computeCost(X,y,theta):\n",
    "    m = X.shape[0]\n",
    "    z = -1*y*np.log(hypothesis(X,theta))-(1-y)*np.log(1-hypothesis(X,theta))\n",
    "    return np.sum(z)/m"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 梯度下降法求解\n",
    "<img src=\"images/04.png\" width=\"250\" align=\"left\"/>"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "outputs": [],
   "source": [
    "def gradientDescent(X,y,theta,iterations,alpha):\n",
    "    #取数据条数\n",
    "    m = X.shape[0]\n",
    "    #在x最前面插入全1的列\n",
    "    X = np.hstack((np.ones((m, 1)), X))\n",
    "    for i in range(iterations):\n",
    "        for j in range(len(theta)):\n",
    "            theta[j] = theta[j]-(alpha/m)*np.sum((hypothesis(X,theta) - y)*X[:,j].reshape(-1,1))\n",
    "        #每迭代1000次输出一次损失值\n",
    "        if(i%10000==0):\n",
    "            print('第',i,'次迭代，当前损失为：',computeCost(X,y,theta),'theta=',theta)\n",
    "    return theta"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 预测函数"
   ],
   "metadata": {
    "collapsed": false
   }
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "outputs": [],
   "source": [
    "def predict(X):\n",
    "    # 在x最前面插入全1的列\n",
    "    c = np.ones(X.shape[0]).transpose()\n",
    "    X = np.insert(X, 0, values=c, axis=1)\n",
    "    #求解假设函数的值\n",
    "    h = hypothesis(X,theta)\n",
    "    #根据概率值决定最终的分类,>=0.5为1类，<0.5为0类\n",
    "    h[h>=0.5]=1\n",
    "    h[h<0.5]=0\n",
    "    return h"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "outputs": [],
   "source": [
    "X,y = loaddata()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "outputs": [],
   "source": [
    "n = X.shape[1]#特征数\n",
    "theta = np.zeros(n+1).reshape(n+1, 1)  # theta是列向量,+1是因为求梯度时X前会增加一个全1列\n",
    "iterations = 250000\n",
    "alpha = 0.008"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第 0 次迭代，当前损失为： 3.4898192542187316 theta= [[ 0.0008    ]\n",
      " [ 0.0959687 ]\n",
      " [-0.17080118]]\n",
      "第 10000 次迭代，当前损失为： 3.633794596164655 theta= [[-6.0072283 ]\n",
      " [ 0.050662  ]\n",
      " [ 0.22802046]]\n",
      "第 20000 次迭代，当前损失为： 1.6421156695148182 theta= [[-11.04817588]\n",
      " [ -0.09665535]\n",
      " [  0.30417947]]\n",
      "第 30000 次迭代，当前损失为： 1.4051177473049952 theta= [[-14.64580889]\n",
      " [  0.33905718]\n",
      " [ -0.09182453]]\n",
      "第 40000 次迭代，当前损失为： 1.1284288395235624 theta= [[-17.65627776]\n",
      " [  0.02789143]\n",
      " [  0.31864018]]\n",
      "第 50000 次迭代，当前损失为： 0.9221874390429973 theta= [[-1.96095214e+01]\n",
      " [ 2.78099355e-01]\n",
      " [ 7.52595875e-03]]\n",
      "第 60000 次迭代，当前损失为： 0.6668312927145998 theta= [[-20.98450998]\n",
      " [  0.08872738]\n",
      " [  0.29042701]]\n",
      "第 70000 次迭代，当前损失为： 0.5397692839824905 theta= [[-22.0116349 ]\n",
      " [  0.17110523]\n",
      " [  0.23684449]]\n",
      "第 80000 次迭代，当前损失为： 0.47798593027345926 theta= [[-22.85406545]\n",
      " [  0.10150192]\n",
      " [  0.26789884]]\n",
      "第 90000 次迭代，当前损失为： 0.3857789652295521 theta= [[-23.52871631]\n",
      " [  0.18088181]\n",
      " [  0.23778719]]\n",
      "第 100000 次迭代，当前损失为： 0.33992108594315495 theta= [[-24.06932143]\n",
      " [  0.1833052 ]\n",
      " [  0.23863557]]\n",
      "第 110000 次迭代，当前损失为： 0.35010989198696474 theta= [[-24.49556703]\n",
      " [  0.2676624 ]\n",
      " [  0.12869878]]\n",
      "第 120000 次迭代，当前损失为： 0.3231728946482656 theta= [[-24.82770761]\n",
      " [  0.25623888]\n",
      " [  0.13760732]]\n",
      "第 130000 次迭代，当前损失为： 0.2774322638143614 theta= [[-25.08203973]\n",
      " [  0.16128906]\n",
      " [  0.25032701]]\n",
      "第 140000 次迭代，当前损失为： 0.251199317011942 theta= [[-25.27055496]\n",
      " [  0.202391  ]\n",
      " [  0.22674699]]\n",
      "第 150000 次迭代，当前损失为： 0.2415806458263704 theta= [[-25.40956873]\n",
      " [  0.18523859]\n",
      " [  0.23836269]]\n",
      "第 160000 次迭代，当前损失为： 0.23128791953448224 theta= [[-25.50914522]\n",
      " [  0.19134865]\n",
      " [  0.23303829]]\n",
      "第 170000 次迭代，当前损失为： 0.22490858412162912 theta= [[-25.57933089]\n",
      " [  0.19028381]\n",
      " [  0.23173448]]\n",
      "第 180000 次迭代，当前损失为： 0.22064458782159618 theta= [[-25.62729742]\n",
      " [  0.22297099]\n",
      " [  0.20378052]]\n",
      "第 190000 次迭代，当前损失为： 0.21528641045011893 theta= [[-25.66060452]\n",
      " [  0.21183528]\n",
      " [  0.19444869]]\n",
      "第 200000 次迭代，当前损失为： 0.2123612218845144 theta= [[-25.68300682]\n",
      " [  0.19663504]\n",
      " [  0.21377662]]\n",
      "第 210000 次迭代，当前损失为： 0.21081476581730588 theta= [[-25.69760438]\n",
      " [  0.20870264]\n",
      " [  0.21525546]]\n",
      "第 220000 次迭代，当前损失为： 0.21019020680798967 theta= [[-25.70775854]\n",
      " [  0.19645322]\n",
      " [  0.21972216]]\n",
      "第 230000 次迭代，当前损失为： 0.2094019452695109 theta= [[-25.7139493 ]\n",
      " [  0.22245758]\n",
      " [  0.19909143]]\n",
      "第 240000 次迭代，当前损失为： 0.20882376625864127 theta= [[-25.71838918]\n",
      " [  0.22210263]\n",
      " [  0.19291801]]\n",
      "theta=\n",
      " [[-25.7214775 ]\n",
      " [  0.21158791]\n",
      " [  0.19917776]]\n"
     ]
    }
   ],
   "source": [
    "theta = gradientDescent(X,y,theta,iterations,alpha)\n",
    "print('theta=\\n',theta)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "markdown",
   "source": [
    "##### 画决策边界"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%% md\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "outputs": [],
   "source": [
    "def plotDescisionBoundary(X,y,theta):\n",
    "    cm_dark = mpl.colors.ListedColormap(['g', 'r'])\n",
    "    plt.xlabel('Exam 1 score')\n",
    "    plt.ylabel('Exam 2 score')\n",
    "    plt.scatter(X[:,0],X[:,1],c=np.array(y).squeeze(),cmap=cm_dark,s=30)\n",
    "\n",
    "    #化分类决策面 theta0+theta1*x1+theta2*x2 = 0\n",
    "    # x1 = np.arange(20,110,0.1)\n",
    "    x1 = np.arange(min(X[:, 0]), max(X[:, 0]), 0.1)\n",
    "    x2 = -(theta[1]*x1+theta[0])/theta[2]\n",
    "    plt.plot(x1,x2)\n",
    "    plt.show()"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "outputs": [
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotDescisionBoundary(X,y,theta)"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "准确度： 0.9\n",
      "准确度： 0.9\n"
     ]
    }
   ],
   "source": [
    "p = predict(X)\n",
    "print('准确度：',np.mean(p==y))\n",
    "print('准确度：',accuracy_score(y,p))"
   ],
   "metadata": {
    "collapsed": false,
    "pycharm": {
     "name": "#%%\n"
    }
   }
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}